package balas;

import java.awt.Point;
import java.awt.geom.Area;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

import logica.SkyNet;
import naves.Jugador;
import naves.PowerUp;

/**
 * @author Martin Castro
 * Clase abstracta que mantiene el estado de todos los objetos bala y enemigos del juego
 */
public abstract class Bala extends JLabel {
	protected int potencia; // valor entre 0 y 100, es lo que se le resta a la vida de quien choca
	protected int vida; // valor entre 0 y 100
	protected Point movimiento; // un vector que indica cómo se mueve la Bala en "un" paso 
	protected SkyNet lord; // mente central que controla todos los enemigos
	protected int velocidad;
	protected boolean esEnemigo; //variable logica que controla si un objeto es enemigo(true) o es un objeto del jugador(false)
	protected boolean esEnemigoFinal;
	protected int puntaje; //valor que entrega el objeto al ser eliminado
	protected boolean esTiro;
	protected boolean esPowerUp;
	
	/**
	 * Comando que se encarga de realizar el impacto entre una nave enemiga y una bala
	 * @param b objeto para impactar
	 */
	public void golpearObjeto(Bala b) {
			if( b.getVida() - this.getPotencia() <= 0 ) {
				if(b.getEsPowerUp()){
					lord.getJuego().setPuntaje(b.getPuntaje());
					b.setIcon(new ImageIcon(getClass().getClassLoader().getResource("images/powerUp.gif")));
					b.setVida(-1000);
				}
				else{
					this.lord.getJuego().setPuntaje(b.getPuntaje());
					this.lord.eliminarObjeto(b);
				}
			}
			else {
				b.setVida( b.getVida() - this.getPotencia() );
				if(b.getEsPowerUp() && b.getVida()>-50 && b.getVida()<=0)
					b=new PowerUp(lord);
			}
		
		this.lord.eliminarObjeto(this);
	}

	/**
	 * @return Vida del objeto
	 */
	public int getVida() {
		return vida;
	}

	/**
	 * @param vida Vida a setear
	 */
	public void setVida(int vida) {
		this.vida = vida;
	}

	/**
	 * @return Potencia
	 */
	public int getPotencia() {
		return potencia;
	}

	/**
	 * @return Movimiento
	 */
	public Point getMovimiento() {
		return movimiento;
	}

	/**
	 * @return SkyNet
	 */
	public SkyNet getLord() {
		return lord;
	}
	/**
	 * @return Puntaje
	 */
	public int getPuntaje(){
		return this.puntaje;
	}
	
	/**
	 * @return Verdadero si es enemigo y falso en caso contrario
	 */
	public boolean getEsEnemigo(){
		return esEnemigo;
	}
	
	/**
	 * @return Verdadero si es el jefe final y falso en caso contrario
	 */
	public boolean getEsEnemigoFinal(){
		return esEnemigoFinal;
	}
	
	/**
	 * @return Verdadero si es un tiro del jugador
	 */
	public boolean getEsTiro(){
		return this.esTiro;
	}

	/**
	 * comando que se encarga de mover el objeto en la direccion indicada por este
	 */
	public void mover() {
		Point position = this.getLocation();
		position.translate(this.movimiento.x, this.movimiento.y);
		this.setLocation(position);
		if(this.getEsTiro() && !lord.getJuego().contains(position))
			lord.eliminarObjeto(this);
	}
	
	/**
	 * @param b objeto a chequear si fue intersectado
	 * @return verdadero si el objeto B intersecta a un objeto de esta clase
	 */
	public boolean alcanzoObjeto(Bala b) {
		Area area1 = new Area(this.getBounds());
		Area area2 = new Area(b.getBounds());
		return area1.intersects(area2.getBounds2D());
	}

	/**
	 * comando que se encarga de "realocar" al objeto
	 */
	public void reLocation() {
		this.lord.eliminarObjeto(this);
	}
	
	/**
	 * @return Verdadero si el objeto tiene o es un poer up, y falso en caso contrario
	 */
	public boolean getEsPowerUp(){
		return this.esPowerUp;
	}
	
}
